﻿/************************************************************************

   Extended Silverlight Toolkit

   Copyright (C) 2010-2012 Xceed Software Inc.

   This program is provided to you under the terms of the Microsoft Public
   License (Ms-PL) as published at http://extendedsilverlight.codeplex.com/license

   Please purchase a commercial version of this toolkit if you are using
   it in a commercial product. The commercial versions support the project,
   and also include more features for each control, priority support,
   source code, updates, removed watermark, and a proprietary license.

   Visit http://xceed.com and follow @datagrid on Twitter.

  **********************************************************************/

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Collections.Generic;

namespace Xceed.Silverlight.Data
{
#if DEBUG
  internal static class DebugExtensions
  {
    public static void RemoveRange<T>( this ObservableCollection<T> list, int index, int count )
    {
      for( int i = count; i > 0; i-- )
      {
        list.RemoveAt( index );
      }
    }

    public static List<T> GetRange<T>( this ObservableCollection<T> list, int index, int count )
    {
      return new List<T>( list ).GetRange( index, count );
    }

    public static void AddRange<T>( this ObservableCollection<T> list, IEnumerable<T> toAdd )
    {
      foreach( T o in toAdd )
      {
        list.Add( o );
      }
    }

    public static void InsertRange<T>( this ObservableCollection<T> list, int index, IEnumerable<T> toInsert )
    {
      int insertPos = index;
      foreach( T o in toInsert )
      {
        list.Insert( insertPos, o );
        insertPos++;
      }
    }

    public static TEnumerator GetEnumeratorType<TData, TEnumerator>( this IAsyncEnumerator<TData> topParent )
    {
      object current = topParent;
      do
      {
        if( typeof( TEnumerator ).IsAssignableFrom( current.GetType() ) )
        {
          return ( TEnumerator )current;
        }
        current = GetEnumeratorChild<TData>( current );
      }
      while( current != null );
      return default( TEnumerator );
    }

    public static TEnumerator GetEnumeratorType<TData, TEnumerator>( this ISyncEnumerator<TData> topParent )
    {
      object current = topParent;
      do
      {
        if( typeof( TEnumerator ).IsAssignableFrom( current.GetType() ) )
        {
          return (TEnumerator)current;
        }
        current = GetEnumeratorChild<TData>( current );
      }
      while( current != null );
      return default( TEnumerator );
    }

    public static object GetEnumeratorChild<TData>( object parentEnumerator )
    {
      if( parentEnumerator == null )
        return null;

      AsyncParentEnumerator<TData> asyncParent = parentEnumerator as AsyncParentEnumerator<TData>;
      if( asyncParent != null )
        return asyncParent.ChildEnumerator;

      AsyncToSyncEnumerator<TData> asyncToSyncParent = parentEnumerator as AsyncToSyncEnumerator<TData>;
      if( asyncToSyncParent != null)
        return asyncToSyncParent.ChildEnumerator;

      SyncToAsyncEnumerator<TData> syncToAsyncParent = parentEnumerator as SyncToAsyncEnumerator<TData>;
      if(syncToAsyncParent != null)
        return syncToAsyncParent.ChildEnumerator;

      return null;
    }
  }
#endif
}
